home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / profile.arc / PROFILE.C < prev    next >
Text File  |  1985-11-28  |  2KB  |  99 lines

  1. /* profile.c - profiles execution of a program
  2.    usage profiler progname progargs1 .. progargsn
  3.    uses the time of day interrupt to sample the instruction pointer
  4.    18 times a second.
  5. */
  6. #define AZTEC        /* uses aztec c 8086 compiler */
  7. #ifdef AZTEC
  8. #define forkv fexecv    /* use the lattice library name */
  9. /* note that the aztec lib function
  10.  * wants the extension on the file name,
  11.  * but lattice only wants the 'run name'
  12.  */
  13.  
  14. #endif
  15. #include <stdio.h>
  16. #include <fcntl.h>
  17. /* the ip_array is 16K long, which means that the resolution of
  18.    the profiler is to 4 bytes
  19.  */
  20. #define IP_ARRAY_SIZE 16384
  21. unsigned int ip_array[IP_ARRAY_SIZE];
  22.  
  23. extern unsigned instruction_pointer;
  24. extern unsigned program_segment;
  25.  
  26. unsigned registers[4];
  27.  
  28. main(argc,argv)
  29. int argc;
  30. char *argv[];
  31. {
  32.     int r;    /* register file */
  33.     char *name;
  34.     char *extension;
  35.     if (argc == 1)
  36.     {
  37.         usage();
  38.         exit();
  39.     }
  40.     /* predict what segments are going to be */
  41.     extension = index(*(++argv),'.') + 1;
  42.     if (!strncmp(extension,"com",3))
  43.         forkv("regs.com",NULL);
  44.     else if (!strncmp(extension,"exe",3))
  45.         forkv("regs.exe",NULL);
  46.     else
  47.         exit();
  48.     if (-1 == (r = open("register",O_RDONLY)))
  49.     {
  50.         fprintf(stderr,"cant find register file\n");
  51.         exit();
  52.     }
  53.     read(r,registers,8);    /* read the registers in */
  54.     close(r);                /* close the file        */
  55.     unlink("register");
  56.     /* otherwise we're going to try . . . */
  57.     int_setup();    /* start sampling    */
  58.     name = *argv; /* name to execute */
  59.     forkv(name,argv);
  60.     int_restore();    /* stop sampling    */
  61.     display_results();
  62.     exit();
  63. }
  64.  
  65. display_results()
  66. {
  67.     register unsigned int i;
  68.     for (i = 0; i < IP_ARRAY_SIZE; i++)
  69.         if (ip_array[i])
  70.             printf("%04x : %u\n",(i << 2),ip_array[i]);
  71. }
  72. /*
  73.     logs the instruction pointer to the ip array
  74. */
  75.  
  76. ip_log()
  77. {
  78.     if (program_segment == registers[0])
  79.         ip_array[(instruction_pointer >> 2)]++;
  80. }
  81. char *usage_txt[] =
  82. {
  83.     "profile.com - profiles execution of a program\r\n",
  84.     "usage profile progname progargs1 .. progargsn\r\n",
  85.     NULL
  86. };
  87. usage()
  88. {
  89. #define STDERR 2
  90.     register char **up;
  91.     up = usage_txt;
  92.     while (*up)
  93.     {
  94.         write(STDERR,*up,strlen(*up));
  95.         ++up;
  96.     }
  97. }
  98.  
  99.